#include <iostream>
#include <cstring>
#include <iomanip>

// FP16转FP32函数
static float fp16_to_fp32(uint16_t fp16_val) {
    // 按IEEE-754标准从FP16转换到FP32
    uint32_t sign = (fp16_val >> 15) & 0x1;
    uint32_t exponent = (fp16_val >> 10) & 0x1F;
    uint32_t fraction = fp16_val & 0x3FF;
    
    uint32_t fp32_val;
    
    if (exponent == 0) {
        if (fraction == 0) {
            // 零值
            fp32_val = sign << 31;
        } else {
            // 非规格化数值
            int e = -14;
            while ((fraction & 0x400) == 0) {
                fraction <<= 1;
                e--;
            }
            fraction &= 0x3FF;
            exponent = e + 127;
            fp32_val = (sign << 31) | (exponent << 23) | (fraction << 13);
        }
    } else if (exponent == 0x1F) {
        // 无穷大或NaN
        fp32_val = (sign << 31) | (0xFF << 23) | (fraction << 13);
    } else {
        // 规格化数值
        exponent = exponent + (127 - 15);
        fp32_val = (sign << 31) | (exponent << 23) | (fraction << 13);
    }
    
    float result;
    memcpy(&result, &fp32_val, sizeof(result));
    return result;
}

int main() {
    std::cout << "FP16转换测试程序" << std::endl;
    
    // 测试一些已知的FP16值
    uint16_t test_values[] = {
        0x0000, // 0.0
        0x3C00, // 1.0  
        0x4000, // 2.0
        0x4200, // 3.0
        0x4400, // 4.0
        0x4500, // 5.0
        0x3800, // 0.5
        0x3400, // 0.25
        0x3E00, // 1.5
        0x4100, // 2.5
    };
    
    std::cout << "已知FP16值测试:" << std::endl;
    for (int i = 0; i < 10; i++) {
        float converted = fp16_to_fp32(test_values[i]);
        std::cout << "0x" << std::hex << std::setw(4) << std::setfill('0') << test_values[i] 
                  << " -> " << std::dec << std::fixed << std::setprecision(6) << converted << std::endl;
    }
    
    // 模拟一些可能的检测框值
    std::cout << "\n模拟检测框值测试:" << std::endl;
    
    // 模拟一些可能的坐标值（以16进制形式）
    uint16_t coord_values[] = {
        0x41FA, // 可能的x坐标
        0x4082, // 可能的y坐标  
        0x42F8, // 可能的宽度
        0x4204, // 可能的高度
    };
    
    std::cout << "坐标值解析:" << std::endl;
    for (int i = 0; i < 4; i++) {
        float converted = fp16_to_fp32(coord_values[i]);
        std::cout << "坐标 " << i << ": 0x" << std::hex << std::setw(4) << std::setfill('0') << coord_values[i] 
                  << " -> " << std::dec << std::fixed << std::setprecision(6) << converted;
        
        // 检查是否像归一化坐标
        if (converted >= 0.0f && converted <= 1.0f) {
            std::cout << " [归一化坐标]";
        } else if (converted > 1.0f && converted < 1000.0f) {
            std::cout << " [可能是像素坐标]";
        } else {
            std::cout << " [异常值]";
        }
        std::cout << std::endl;
    }
    
    return 0;
} 